/**
 * proxy 在目标对象之前架设拦截
 * 可以对外界的访问进行过滤和改写
 * var proxy = new Proxy(target, handler);
 * target参数表示所要拦截的目标对象，handler参数也是一个对象，用来定制拦截行为。
 */

let person = {
  name: 'zhangsan'
}

let proxy = new Proxy(person, {
  //get参数: 目标对象、属性名和 proxy 实例本身（严格地说，是操作行为所针对的对象），其中最后一个参数可选。
  get: function (target, proxyKey) {
    if (proxyKey in target) {
      return target[proxyKey]
    } else {
      // throw new ReferenceError("Prop name \"" + proxyKey + "\" does not exist.");
      return 'error'
    }
  },
  //set方法用来拦截某个属性的赋值操作，可以接受四个参数，依次为目标对象、属性名、属性值和 Proxy 实例本身，其中最后一个参数可选。
  set(target, p, newValue, receiver) {
    if (p in target) {
      console.log(p)
      if (p === 'name') {
        target.name = 'proxyName' //拦截name修改
      }
    } else {
      target[p] = newValue
    }
  }
})

//get 读取代理对象的任何值都会被拦截
console.log(proxy.name) //zhangsan
console.log(proxy.title)//ReferenceError: Prop name "title" does not exist.

//set
proxy.name = 'xiaohong'
console.log(proxy.name)

proxy.array = [1, 2, 3, 4]
console.log(proxy) //{ name: 'proxyName', array: [ 1, 2, 3, 4 ] }
console.log(proxy.array) //[ 1, 2, 3, 4 ]


console.log()







